<!DOCTYPE html>
<html class="client-nojs vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-0 vector-toc-not-available vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-0 skin-theme-clientpref-day vector-sticky-header-enabled" lang="de" dir="ltr"><head>
<meta charset="UTF-8">
<title>Deque</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/png" href="./_res_/favicon.png">
<link rel="canonical" href="https://de.wikipedia.org/wiki/Deque"> <link href="./_mw_/ext.cite.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.pygments.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.wikimediamessages.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link href="./_mw_/ext.gadget.citeRef.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.defaultPlainlinks.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonHide.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonLayout.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonStyle.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiDarkmode.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiResponsive.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.specialSearch.css" rel="stylesheet" type="text/css">
<link rel="stylesheet" type="text/css" href="./_mw_/site.styles.css">
<link rel="stylesheet" type="text/css" href="./_mw_/noscript.css">
<link rel="stylesheet" type="text/css" href="./_res_/footer.css">
<link rel="stylesheet" type="text/css" href="./_res_/vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Deque rootpage-Deque skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading"><span class="mw-page-title-main">Deque</span></h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="contentSub">
<div id="mw-content-subtitle"></div>
</div>
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="de" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="de" dir="ltr"><p>Ein <b>Deque</b> (<i><b>D</b>ouble-<b>e</b>nded <b>que</b>ue</i>, sprich: „Deck“) bezeichnet eine <a href="Datenstruktur" title="Datenstruktur">Datenstruktur</a> der <a href="Informatik" title="Informatik">Informatik</a>.
</p><p>Hierbei handelt es sich um eine <a href="Datenstruktur" title="Datenstruktur">Datenstruktur</a> ähnlich der <a href="Warteschlange_(Datenstruktur)" title="Warteschlange (Datenstruktur)">Warteschlange</a> oder des <a href="Stapelspeicher" title="Stapelspeicher">Stapelspeichers</a>. Es kombiniert die Eigenschaften beider <a href="Datentyp" title="Datentyp">Datentypen</a>. Der Unterschied besteht darin, dass die Daten an beiden Enden gelesen, eingefügt oder entfernt werden können.
</p>
<div class="mw-heading mw-heading2"><h2 id="Eigenschaften">Eigenschaften</h2></div>
<p>Die Operationen eines Deque, die in den <a href="Programmbibliothek" title="Programmbibliothek">Programmbibliotheken</a> verschiedener <a href="Programmiersprache" title="Programmiersprache">Programmiersprachen</a> nicht einheitlich benannt sind:
</p>
<ul><li><i>push</i> und <i>pop</i> für das Einfügen oder Entnehmen eines Elements am hinteren Ende der Deque.</li>
<li><i>put</i> und <i>get</i> für das Einfügen oder Entnehmen am vorderen Ende der Deque.</li>
<li><i>first</i> und <i>last</i> für das Lesen des ersten oder letzten Elementes, ohne es zu entfernen.</li></ul>
<p>Technisch wird ein Deque als ein Array von Pointern auf einzelne Chunks mit jeweils gleicher Größe realisiert. Damit ist gesichert, dass der wahlfreie Zugriff mit konstanter Zeit erfolgen kann, was der C++-Standard verlangt. Durch die jeweils gleiche Größe der Chunks lässt sich deren Position für den indizierten Zugriff (Operator []) schnell berechnen. Dies wäre mit einer verketteten Liste nicht möglich. Dadurch, dass jeweils mehrere Elemente in einen Chunk passen ist das Einfügen und Entfernen an den Enden schneller als bei einer Liste da für so viele Elemente die in einen Chunk passen genau eine Speicherallokation erforderlich ist.
</p><p>Deques sind Sequenzcontainer mit dynamischen Größen, die an beiden Enden (entweder vorne oder hinten) erweitert oder verkleinert werden können. Bestimmte <a href="Programmbibliothek" title="Programmbibliothek">Programmbibliotheken</a> können Deques auf unterschiedliche Weise implementieren, im Allgemeinen als eine Form eines dynamischen <a href="Feld_(Datentyp)" class="mw-redirect" title="Feld (Datentyp)">Arrays</a>. In jedem Fall ermöglichen sie jedoch den direkten Zugriff auf die einzelnen Elemente über Iteratoren mit wahlfreiem Zugriff, wobei der Speicher automatisch verwaltet wird, indem der Container nach Bedarf erweitert und verkleinert wird.
</p><p>Daher bieten sie eine ähnliche Funktionalität wie <a href="Feld_(Datentyp)" class="mw-redirect" title="Feld (Datentyp)">Arrays</a>, jedoch mit effizienter Einfügung und Löschung von Elementen auch am Anfang der Sequenz und nicht nur am Ende. Im Gegensatz zu Arrays wird jedoch nicht garantiert, dass Deques alle ihre Elemente an zusammenhängenden <a href="Speicheradresse" title="Speicheradresse">Speicheradressen</a> speichern: Der Zugriff auf Elemente in einer Deque durch Versetzen eines Zeigers auf ein anderes Element führt zu undefiniertem Verhalten. Sowohl dynamischen Arrays als auch Deques bieten eine sehr ähnliche Schnittstelle und können für ähnliche Zwecke verwendet werden, aber intern funktionieren beide auf ganz unterschiedliche Weise: Während Vektoren ein einzelnes Array verwenden, das gelegentlich für das Wachstum neu zugewiesen werden muss, können die Elemente eines Deque auf verschiedene <a href="Speicherblock" class="mw-redirect" title="Speicherblock">Speicherblöcke</a> verstreut werden, wobei der Container die erforderlichen Informationen intern speichert, um in konstanter <a href="Laufzeit_(Informatik)" title="Laufzeit (Informatik)">Laufzeit</a> und mit einer einheitlichen sequentiellen Schnittstelle (über <a href="Iterator" title="Iterator">Iteratoren</a>) direkten Zugriff auf eines seiner Elemente zu ermöglichen.
</p><p>Daher sind Deques intern etwas komplexer, aber dies ermöglicht es ihnen, unter bestimmten Umständen effizienter zu wachsen, insbesondere bei sehr langen Sequenzen, bei denen Neuzuweisungen teurer werden. Bei <a href="Operation_(Informatik)" title="Operation (Informatik)">Operationen</a>, bei denen Elemente häufig an anderen Positionen als am Anfang oder am Ende eingefügt oder entfernt werden, sind Deques schlechter und weisen weniger konsistente <a href="Iterator_(Entwurfsmuster)" title="Iterator (Entwurfsmuster)">Iteratoren</a> und <a href="Referenz_(Programmierung)" title="Referenz (Programmierung)">Referenzen</a> auf als <a href="Liste_(Datenstruktur)" title="Liste (Datenstruktur)">Listen</a>.<sup id="cite_ref-1" class="reference"><a href="#cite_note-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup>
</p><p>In der Praxis verwendet man die Deque unter anderem zur Implementierung von <a href="Nichtdeterministischer_endlicher_Automat" title="Nichtdeterministischer endlicher Automat">nichtdeterministischen endlichen Automaten</a> und zur Textsuche mittels <a href="Regul%C3%A4rer_Ausdruck" title="Regulärer Ausdruck">regulärer Ausdrücke</a> (<a href="Pattern_Matching" title="Pattern Matching">Pattern-Matching</a>-<a href="Algorithmus" title="Algorithmus">Algorithmus</a>).
</p>
<div class="mw-heading mw-heading2"><h2 id="Programmierung">Programmierung</h2></div><p>
Das folgende Beispiel in der <a href="Programmiersprache" title="Programmiersprache">Programmiersprache</a> <a href="C%2B%2B" title="C++">C++</a> mit Spielkarten zeigt die Verwendung der <a href="Klasse_(Objektorientierung)" title="Klasse (Objektorientierung)">Klasse</a> <i>deque</i> der <a href="C%2B%2B-Standardbibliothek" title="C++-Standardbibliothek">C++-Standardbibliothek</a> (siehe auch <a href="Template_(C%2B%2B)#Klassen-Templates" title="Template (C++)">Template (C++) - Klassen-Templates</a>). Bei der Ausführung des Programms wird die Methode <i>main</i> verwendet.<sup id="cite_ref-2" class="reference"><a href="#cite_note-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup></p><div class="mw-highlight mw-highlight-lang-cpp mw-content-ltr" dir="ltr"><pre><span></span><span class="cp">#include</span><span class="w"> </span><span class="cpf"><deque></span><span class="c1"> // Bindet den Datentyp deque in das Programm ein</span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf"><iostream></span>
<span class="k">using</span><span class="w"> </span><span class="k">namespace</span><span class="w"> </span><span class="nn">std</span><span class="p">;</span>
<span class="kt">int</span><span class="w"> </span><span class="nf">main</span><span class="p">()</span>
<span class="p">{</span>
<span class="w"> </span><span class="n">deque</span><span class="o"><</span><span class="n">string</span><span class="o">></span><span class="w"> </span><span class="n">myDeque</span><span class="p">;</span><span class="w"> </span><span class="c1">// Deklariert ein Deque mit dem Elementtyp string</span>
<span class="w"> </span><span class="c1">// Fügt dem Deque 3 Elemente vom Typ string am Ende hinzu</span>
<span class="w"> </span><span class="n">myDeque</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="s">"Kreuz Bube"</span><span class="p">);</span>
<span class="w"> </span><span class="n">myDeque</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="s">"Herz Dame"</span><span class="p">);</span>
<span class="w"> </span><span class="n">myDeque</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="s">"Karo König"</span><span class="p">);</span>
<span class="w"> </span><span class="n">cout</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="s">"Die Länge des Deque ist "</span>
<span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="n">myDeque</span><span class="p">.</span><span class="n">size</span><span class="p">()</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="n">endl</span><span class="p">;</span><span class="w"> </span><span class="c1">// Ausgabe Anzahl der Elemente</span>
<span class="w"> </span><span class="n">string</span><span class="w"> </span><span class="n">card</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">myDeque</span><span class="p">.</span><span class="n">front</span><span class="p">();</span><span class="w"> </span><span class="c1">// Weist das Element am Anfang ("Kreuz Bube") der Variablen card zu</span>
<span class="w"> </span><span class="n">cout</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="s">"Die Karte am Anfang der Deque ist: "</span>
<span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="n">card</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="n">endl</span><span class="p">;</span><span class="w"> </span><span class="c1">// Ausgabe</span>
<span class="w"> </span><span class="n">card</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">myDeque</span><span class="p">.</span><span class="n">back</span><span class="p">();</span><span class="w"> </span><span class="c1">// Weist das Element am Ende ("Karo König") der Variablen card zu</span>
<span class="w"> </span><span class="n">cout</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="s">"Die Karte am Ende der Deque ist: "</span>
<span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="n">card</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="n">endl</span><span class="p">;</span><span class="w"> </span><span class="c1">// Ausgabe der Karte</span>
<span class="w"> </span><span class="n">cout</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="n">toString</span><span class="p">(</span><span class="n">myDeque</span><span class="p">)</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="n">endl</span><span class="p">;</span><span class="w"> </span><span class="c1">// Ausgabe: (Kreuz Bube, Herz Dame, Karo König)</span>
<span class="w"> </span><span class="n">myDeque</span><span class="p">.</span><span class="n">push_front</span><span class="p">(</span><span class="s">"Kreuz 10"</span><span class="p">);</span><span class="w"> </span><span class="c1">// Fügt 1 Element am Anfang des Deque ein</span>
<span class="w"> </span><span class="n">cout</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="s">"Die Länge des Deque ist "</span>
<span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="n">myDeque</span><span class="p">.</span><span class="n">size</span><span class="p">()</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="n">endl</span><span class="p">;</span><span class="w"> </span><span class="c1">// Ausgabe Anzahl der Elemente </span>
<span class="w"> </span><span class="n">cout</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="n">toString</span><span class="p">(</span><span class="n">myDeque</span><span class="p">)</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="n">endl</span><span class="p">;</span><span class="w"> </span><span class="c1">// Ausgabe: (Kreuz 10, Kreuz Bube, Herz Dame, Karo König)</span>
<span class="w"> </span><span class="n">myDeque</span><span class="p">.</span><span class="n">pop_back</span><span class="p">();</span><span class="w"> </span><span class="c1">// Entfernt das Element am Ende</span>
<span class="w"> </span><span class="n">cout</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="n">toString</span><span class="p">(</span><span class="n">myDeque</span><span class="p">)</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="n">endl</span><span class="p">;</span><span class="w"> </span><span class="c1">// Ausgabe: (Kreuz 10, Kreuz Bube, Herz Dame)</span>
<span class="w"> </span><span class="n">myDeque</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="s">"Karo Ass"</span><span class="p">);</span><span class="w"> </span><span class="c1">// Fügt dem Deque 1 Element am Ende hinzu</span>
<span class="w"> </span><span class="n">cout</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="n">toString</span><span class="p">(</span><span class="n">myDeque</span><span class="p">)</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="n">endl</span><span class="p">;</span><span class="w"> </span><span class="c1">// Ausgabe auf der Konsole: (Kreuz 10, Kreuz Bube, Herz Dame, Karo Ass)</span>
<span class="w"> </span><span class="n">myDeque</span><span class="p">.</span><span class="n">pop_front</span><span class="p">();</span><span class="w"> </span><span class="c1">// Entfernt das Element am Anfang</span>
<span class="w"> </span><span class="n">cout</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="n">toString</span><span class="p">(</span><span class="n">myDeque</span><span class="p">)</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="n">endl</span><span class="p">;</span><span class="w"> </span><span class="c1">// Ausgabe: (Kreuz Bube, Herz Dame, Karo Ass)</span>
<span class="p">}</span>
</pre></div>
<p>Für die Ausgabe des Deque wird folgende <a href="Methode_(Programmierung)" title="Methode (Programmierung)">Methode</a> verwendet:
</p>
<div class="mw-highlight mw-highlight-lang-cpp mw-content-ltr" dir="ltr"><pre><span></span><span class="c1">// Diese Methode gibt das Deque in der Form (A, B, C, ...) als Text zurück.</span>
<span class="n">string</span><span class="w"> </span><span class="nf">toString</span><span class="p">(</span><span class="n">deque</span><span class="o"><</span><span class="n">string</span><span class="o">></span><span class="w"> </span><span class="o">&</span><span class="w"> </span><span class="n">aDeque</span><span class="p">)</span>
<span class="p">{</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">aDeque</span><span class="p">.</span><span class="n">empty</span><span class="p">())</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="s">"()"</span><span class="p">;</span>
<span class="w"> </span><span class="n">string</span><span class="w"> </span><span class="n">text</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">"("</span><span class="p">;</span>
<span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kt">size_t</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="n">aDeque</span><span class="p">.</span><span class="n">size</span><span class="p">()</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">)</span>
<span class="w"> </span><span class="n">text</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="n">aDeque</span><span class="p">.</span><span class="n">at</span><span class="p">(</span><span class="n">i</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s">", "</span><span class="p">;</span>
<span class="w"> </span><span class="n">text</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="n">aDeque</span><span class="p">.</span><span class="n">at</span><span class="p">(</span><span class="n">aDeque</span><span class="p">.</span><span class="n">size</span><span class="p">()</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">1</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s">")"</span><span class="p">;</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">text</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
<p>Für die Programmierung von <a href="Kartenspiel" title="Kartenspiel">Kartenspielen</a> und <a href="Gesellschaftsspiel" title="Gesellschaftsspiel">Gesellschaftsspielen</a> mit Stapeln, bei denen während des Spiels Karten auf einen Stapel gelegt oder von einem Stapel gezogen wird, sind stattdessen Stacks geeignet (siehe <a href="Stapelspeicher#Beispiel_mit_Spielkarten" title="Stapelspeicher">Stapelspeicher - Beispiel mit Spielkarten</a>).
</p>
<div class="mw-heading mw-heading2"><h2 id="Siehe_auch">Siehe auch</h2></div>
<ul><li><a href="Warteschlange_(Datenstruktur)" title="Warteschlange (Datenstruktur)">Warteschlange (Datenstruktur)</a></li>
<li><a href="Stapelspeicher" title="Stapelspeicher">Stapelspeicher</a></li>
<li><a href="Doppelt_verkettete_Liste" class="mw-redirect" title="Doppelt verkettete Liste">Doppelt verkettete Liste</a></li>
<li><a href="Heap_(Datenstruktur)" title="Heap (Datenstruktur)">Heap (Datenstruktur)</a></li>
<li><a href="Iterator" title="Iterator">Iterator</a></li></ul>
<div class="mw-heading mw-heading2"><h2 id="Weblinks">Weblinks</h2></div>
<p>www.geeksforgeeks.org: <a rel="nofollow" class="external text" href="https://www.geeksforgeeks.org/implementation-deque-using-doubly-linked-list/">Implementation of Deque using doubly linked list</a>
</p>
<div class="mw-heading mw-heading2"><h2 id="Einzelnachweise">Einzelnachweise</h2></div>
<ol class="references">
<li id="cite_note-1"><span class="mw-cite-backlink"><a href="#cite_ref-1">↑</a></span> <span class="reference-text">www.cplusplus.com: <a rel="nofollow" class="external text" href="https://www.cplusplus.com/reference/deque/deque/">deque</a></span>
</li>
<li id="cite_note-2"><span class="mw-cite-backlink"><a href="#cite_ref-2">↑</a></span> <span class="reference-text">Microsoft Docs: <a rel="nofollow" class="external text" href="https://docs.microsoft.com/en-us/cpp/standard-library/deque-class?view=msvc-160">deque Class</a></span>
</li>
</ol></div><!--htdig_noindex--><div><div class="zim-footer">
Dieser Artikel wurde von <a class="external text" title="Zuletzt bearbeitet am 2024-08-25" href="https://de.wikipedia.org/wiki/?title=Deque&oldid=248044485">Wikipedia</a> herausgegeben. Der Text ist unter <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.de">Creative Commons Attribution-Share Alike 4.0</a> verfügbar, sofern nicht anders angegeben. Für die Mediendateien können zusätzliche Bedingungen gelten.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>
<script src="./_webp_/webpHandler.js"></script>
</body></html>